// #include<vector>
// #include<limits>
// #include<cstddef>
// #include<iostream>
// #include<sstream>
// #include<map>
// #include<algorithm>
// #include<tuple>
// #include<unordered_map>
// #include<functional>
// #include<memory>
// using namespace std;

// struct PrefixNode{
// public:
//     map<char, std::shared_ptr<PrefixNode> > children;
//     // vector<int> wordSet;
//     bool isEnd = false;
//     int endWord = -1;
// };
// class Luhhp{
// public:
//     std::shared_ptr<PrefixNode> root;
//     std::shared_ptr<vector<string> > words;
//     void Init(){
//         root = std::make_shared<PrefixNode>();
//     }
//     bool FindWord(string &word){
//         auto cur = root;
//         for(auto i = 0; i < word.size(); i++){
//             auto c = word[i];
//             if(cur->children.find(c) == cur->children.end()){
//                 return false;
//             }
//             cur = cur->children[c];
//         } 
//         if(cur->isEnd) return true;
//         return false;
//     }
//     void InsertWord(string &word, int index){
//         auto cur = root;
//         for(auto i = 0; i < word.size(); i++){
//             auto c = word[i];
//             if(cur->children.find(c) == cur->children.end()){
//                 cur->children[c] = std::make_shared<PrefixNode>();
//             }
//             cur = cur->children[c];
//         }
//         cur->isEnd = true;
//         cur->endWord = index;
//     }
//     void CollectChildWord(std::shared_ptr<PrefixNode> node, std::shared_ptr<vector<int>> ptr){
//         if(node->isEnd){
//             ptr->push_back(node->endWord);
//         }
//         // for(auto i = 0; i < node->children.size(); i++){
//         for(auto i = 'a'; i <= 'z'; i++){
//             if(node->children.find(i) != node->children.end()) {
//                 CollectChildWord(node->children[i], ptr);
//             }
//         }
//     }
//     std::shared_ptr<vector<int> > FindWordSet(string &word){
//         auto cur = root;
//         auto findLast = true;
//         for(auto i = 0; i < word.size(); i++){
//             auto c = word[i];
//             if(cur->children.find(c) == cur->children.end()){
//                 findLast = false;
//                 break;
//             }
//             cur = cur->children[c];
//         }
//         if(cur != root && findLast){
//             //从左向右遍历
//             auto ret = std::make_shared<vector<int> >();
//             CollectChildWord(cur, ret);
//             return ret;
//         }
//         return nullptr;
//     }
// };
// int main(int, char**) {
//     auto words = std::make_shared<vector<string> >();
//     string n;
//     getline(cin, n);
//     auto nn = std::stoi(n);
//     for(auto iv = 0; iv < nn; iv++) {
//         string str;
//         getline(cin, str);
//         words->push_back(str);
//     }
//     // vector<string> wds{
//     //     "too",
//     //     "young",
//     //     "simple",
//     //     "naive",
//     //     "coffee",
//     // };
//     // for(auto it = wds.begin(); it != wds.end(); it++) words->push_back(*it);
//     // vector<string> test{
//     //     "naive",
//     //     "angry",
//     //     "co",
//     //     "covfefe",
//     //     "co",
//     // };
//     Luhhp tree;
//     tree.words = words;
//     tree.Init();
//     for(auto i = 0; i < words->size(); i++){
//         auto find = tree.FindWord((*words)[i]);
//         if(!find){
//             tree.InsertWord((*words)[i], i);
//         }
//     }

//     string q;
//     getline(cin, q);
//     auto qq = std::stoi(q);
//     for(auto i = 0; i < qq; i++) {
//     // for(auto i = 0; i < test.size(); i++){
//         string gw;
//         getline(cin, gw);
//         auto ret = tree.FindWordSet(gw);
//         auto find = tree.FindWord(gw);
//         // 插入新的单词
//         if(!find) {
//             words->push_back(gw);
//             tree.InsertWord(gw, words->size()-1);
//         }
//         // cout << "####" << ret << endl;
//         if(ret != nullptr){
//             auto outNum = 0;
//             if(!find) {
//                 outNum++;
//                 std::cout << gw << endl;
//             }
//             for(auto it = ret->begin(); it != ret->end() && outNum < 50; it++){
//                 std::cout << (*words)[*it] << endl;
//                 outNum++;
//             }
//         }else { //没找大
//             std::cout << gw << endl;
//         }
//     }
// }